import java.util.ArrayList;
import java.util.List;

/**
 * Created with BigBoo.
 * User: boo
 * Date: 22.09.13
 * Time: 1:13
 * \(=^_^=)/
 */
public class MathUtils {

    public static long OnlyExp (long base, long exponent){
        long buf=1;
        for (int i=0; i<exponent;i++)
            buf=buf*base;
        return (buf);
    }

    public static double FreeBaseLog (long x,long a){
        double res = Math.log10(x)/Math.log10(a);
        return (res);
    }
    public static int[] ConvertDecimalToBinary (int x){
        int buf=1;
        List<Integer> ArrBin = new ArrayList<Integer>();
        do {
            buf=x%2;
            x=x/2;
            ArrBin.add(buf);
        } while (x>=2);
        int temp=0;
        ArrBin.add(1);

        int[] IntSourceArr = new int [ArrBin.size()];
        int cnt = 0;
        for (int i=ArrBin.size()-1;i>=0;i--)
        {    IntSourceArr[cnt] = (int)ArrBin.get(i);
            //System.out.print(ReArr[cnt]);
            cnt+=1;       }
        return (IntSourceArr);
    }

    public static long[] SieveEratosfen (int IMAX) {   //решето Эратосфена
        long[] S = new long[IMAX+1];
        S[0]=0;
        for (int i=2;i<IMAX+1;i++) S[i]=1;
        for (int i=2;i*i<IMAX+1; i++){
            if (S[i]==1){
                for (int k=i*i;k<IMAX+1;k+=i)
                    S[k]=0;
            }
        }//for (int i=0;i<IMAX+1;i++)
        // System.out.print(S[i]+" ");
        return (S); }

    public static List<Integer> ArrayOfSimpleDigit (int p) {      //создает массив из простых чисел от 2 до p
        List<Integer> ArrayOfSieve = new ArrayList<Integer>();
        for (int i=1;i<MathUtils.SieveEratosfen(p).length;i++)
            if (MathUtils.SieveEratosfen(p)[i]==1) ArrayOfSieve.add(i);
        return (ArrayOfSieve);}


    public static boolean SimplicityCheck (int p){               //проверка на вшивость ~100 000 заняла 2min 40s
        if (p%2==0) return (true);
        for (int i=MathUtils.SieveEratosfen(p).length-1;i>=0;i--)
            if (MathUtils.SieveEratosfen(p)[i]==1 && p==i) return (false);
        return (true);}
}
